package com.yc.thread.basic;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * sleep和wait方法在锁上的区别
 *
 * @author zwei
 * @create 2024-07-15 20:38
 */
public class Test11_sleep_wait_lock {
    public static void main(String[] args) {
        final Test11_sleep_wait_lock test1=new Test11_sleep_wait_lock();    //new一次 一个对象 一把锁
        for (int i = 0; i < 5; i++) {
            new Thread(test1::sleepMethod).start();
//            new Thread(new Runnable() {  //相当于new Thread(test1::sleepMethod).start();
//                @Override
//                public void run() {
//                    test1.sleepMethod();
//                }
//            }).start();
        }
        //测试另一种情况  wait
//        final Test11_sleep_wait_lock test2=new Test11_sleep_wait_lock();
//        for (int i = 0; i < 5; i++) {
//            new Thread(test2::waitMethod).start();
//        }
    }
    /**
     * 此方法会被n个线程来调用，会发生争取  同时只能一个线程进行执行
     * sleep()方法不会释放锁  因此线程是按照先后顺序来执行的
     * synchronized的作用  加锁
     *
     * @return
     */
    //public void run(){}
    public synchronized void sleepMethod() {
        System.out.println(printDate() + Thread.currentThread().getName() + "休眠1秒");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println(printDate() + Thread.currentThread().getName() + "休眠结束");
    }

    /**
     * wait方法会释放锁，因此一旦调用wait()方法就会造成其他线程运行
     * 同步方法
     *
     * @return
     */
    public synchronized void waitMethod() {
        System.out.println(printDate() + Thread.currentThread().getName() + "等待一秒");
        try {
            wait(1000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println(printDate()+Thread.currentThread().getName()+"等待结束");
    }

    //获取当前时间
    private static String printDate() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return sdf.format(new Date()) + " ";
    }
}
